\par Para um profundo entendimento deste trabalho, é importante ter uma cópia do
código fonte no computador, ou então, analisá-lo diretamente no repositório do 
projeto. Nesta seção, vamos mostrar como usar as duas alternativas e em seguida 
explicaremos como foi o processo de desenvolvimento. No capítulo \ref{cap:works} 
explicaremos o funcionamento interno do controle de quotas.

\subsection{Download do código}
\par Para quem deseja estudar o projeto detalhadamente é aconselhável que seja 
feito o download do código fonte. Para isso, é necessário ter um sistema operacional 
baseado no \textit{kernel Linux\copyright} instalado e com acesso a internet. 
Para isso, pode-se utilizar uma máquina virtual, como por exemplo o 
\textit{virtual box}\footnote{\url{www.virtualbox.org}} e em seguinda instalar 
uma distribuição \textit{Linux\copyright} de sua escolha. Caso não haja preferência, aconselhamos o uso da 
distribuição \textit{Ubuntu} \footnote{\url{www.ubuntu.com}}. Os detalhes da instalação 
não serão abordados aqui pois existe uma grande quantidade de tutoriais na 
internet que abordam todos os procedimentos da instalação.

\par Após instalar o \textit{Linux\copyright}, será necessário instalar o 
sistema de controle de versão bazar. Para isso, basta instalar o pacote 
\textit{bzr}\footnote{Para distribuições baseadas no \textit{Debian} 
basta executar o seguinte comando: 
\textbf{\textit{apt-get install bzr}}} e 
em seguinda executar o seguinte comando: \textbf{bzr branch lp:sqm}. Aguarde a conclusão do 
download, será criado um diretório chamado \textbf{sqm} e dentro dele todos os 
arquivos do projeto.

\par O comando usado acima permite apenas fazer o download do código fonte. Para 
ter permissão de enviar(\textit{upload}) modificações para o repositório oficial é 
necessário primeiro realizar o cadastro no \textit{launchpad} e em seguida 
solicitar permissão para participar do projeto.

\subsection{Acesso via browser}
\par Para quem não tem interesse de estudar cada detalhe do projeto, pode acessá
-lo diretamente via browser no seguinte endereço: \url{https://launchpad.net/sqm}.

\subsection{Primeira etapa}

\par Todo o funcionamento do SQM é dependente do arquivo de log de acesso do 
\textit{Squid} -- \textit{access.log} --, sendo assim, parte da estrutura do banco de dados é reflexo da 
estrutura deste log. Portanto nossa primeira tarefa foi estudar este log detalhadamente. 
No site do projeto \textit{Squid}\footnote{\url{http://wiki.squid-cache.org/SquidFaq/SquidLogs\#access.
log_native_format_in_detail}} existe uma seção dedicada exclusivamente a explicar 
de forma detalhada todos os logs do \textit{Squid}. Após esta análise verificamos que cada linha no 
arquivo de log tem o seguinte formato: \\
\textit{\textbf{\small{time duration clientaddress resultcode/status bytes method URL 
rfc931 peerstatus/peerhost type}}}

\par Neste ponto é necessário fazer uma importante observação. A estrutura do 
\textit{access.log} mostrada neste trabalho é a estrutura padrão. O \textit{Squid} permite 
personalizá-la de acordo com as necessidades do administrador.
Como este projeto está em sua etapa inicial, não vamos nos preocupar com logs 
personalizados pois isto exigirá um maior tempo para discutir, testar e 
implementar a melhor solução. Portanto, vamos deixar este recurso para ser 
implementado em versões futuras.

\par Para um melhor entendimento, vamos analisar rápida e superficialmente cada 
campo:

\begin{enumerate}
    \item \textbf{time} - Data e a hora do acesso(formato Unix timestamp);
    \item \textbf{elapsed} - Tempo para processar a requisição(em milisegundos);
    \item \textbf{clientaddress} - Endereço IP do host que requisitou acesso;
    \item \textbf{resultcode/status} - Este campo, que é separado barra, informa 
     o resultado da transação;
    \item \textbf{bytes} - Bytes transferidos;
    \item \textbf{method} - Método usado para requisitar o objeto;
    \item \textbf{URL} - URL requisitada pelo cliente;
    \item \textbf{rfc931} - Proprietário da conexão, nome do usuário que fez 
    a solicitação.
    \item \textbf{peerstatus/peerhost} - O \textit{Squid} permite trabalhar em uma hierarquia de 
    servidores proxy, neste caso, seria armazenado o status e o endereço do 
    servidor para o qual foi feita a requisição. Mas na maioria dos casos não 
    existe uma hierarquia então será armazenado o endereço do servidor que 
    hospeda o objeto requisitado.
    \item \textbf{type} - Tipo de conteúdo(mime type).
\end{enumerate}

\subsection{Segunda etapa}

\par Conhecendo a estrutura do log começamos a escrevre os modelos que representam 
estes dados e em seguida fizemos a sincronização com o banco de dados para 
criar a estrutura desejada. Este modelo pode ser encontrado no seguinte arquivo:

\begin{itemize}
    \item \textit{sqm/core/network/models.py}
\end{itemize}
 
% que pode ser encontrado \htmladdnormallink{\textit{
%\textcolor{blue}{\underline{neste link}}}.}{
%http://bazaar.launchpad.net/~eltonplima/sqm/devel/files/head\%3A/core/network/}

\par Com o banco de dados criado, geramos o diagrama de relacionamentos de 
todo o banco de dados com o auxílio da ferramenta \textit{schemaspy}
\footnote{http://schemaspy.sourceforge.net/} que é distribuída sob os termos da 
GPL. Nós pretendiamos inserir este diagrama completo neste trabalho mas como sua 
estrutura é muito extensa optamos por fornecer a localização do mesmo. Para 
aqueles que optaram por fazer o download do código fonte, a localização é a 
seguinte: \par \textit{sqm/documentation/diagrams/database/diagrams} \newline

\par Para aqueles que não fizeram o download do código fonte, basta acessar o link a 
seguir, realizar o download do único arquivo que está disponível e em seguida 
descompactá-lo: \par \url{http://code.google.com/p/tcc-sqm/downloads/list}

\par Após a descompactação, será criada uma hierarquia de diretórios com o seguinte 
formato: \textit{documentation/diagrams/database/diagrams}

%link que dá acesso 
%direto a documentação oficial do projeto, que está \htmladdnormallink{\textit{
%\textcolor{blue}{\underline{neste link}}}.}{http://bazaar.launchpad.net/\~eltonplima/sqm/deve7l/
%files/head\%3A/documentation/diagrams/database/diagrams/}

\par Para navegar pela estrutura do banco de dados basta abrir o seguinte 
arquivo com seu navegador de internet favorito:

\textit{/sqm/documentation/diagrams/database/index.html}.

\subsection{Terceira etapa}

\par Com o banco de dados pronto para receber os dados, iniciamos o 
desenvolvimento do importador(\textit{import.py}), ou seja, o aplicativo responsável 
por analisar cada linha do \textit{access.log}, identificar cada campo, 
relacioná-los e armazená-los em suas respectivas tabelas no banco de dados.

\par Uma preocupação que tivemos foi a de cuidar para não houvesse a possibilidade 
de dados serem duplicados, pois isso causaria a perda da confiabilidade do 
sistema retratando assim um cenário que não seria compatível com o cenário real, 
pois um usuário mal intencionado ou mesmo descuidado poderia tentar 
reimportar um log antigo, causando duplicação desnecessária de dados. 
Após algumas discussões decidimos criar um novo campo na tabela 
\textit{network\_traffic} chamado \textit{hash\_line}. Sua função é  
armazenar a soma md5 daquela linha, e em seguida configuramos este campo como 
único e de preenchimento obrigatório. O cálculo do md5 é realizado pelo 
importador antes de tentar inserir os dados no banco de dados.

\par O importador está em versão beta e já está importando os dados para o 
banco de dados. Estamos escrevendo uma rotina de testes automáticos para validar o
que foi inserido com o que está no arquivo de log. Após esta etapa serão feitas 
correções -- se for necessário -- e iremos liberar a versão release 
candidate para que outras pessoas possam realizar testes mais rígidos em outros
ambientes fora da Tavares \& Souza.

\subsection{Quarta etapa}
\par Com o banco de dados pronto e o importador funcionando, começamos a 
escrever as \textit{stored procedures} e \textit{triggers} responsáveis pela 
contabilização e controle das quotas.

\par A tabela responsável por armazenar a contabilização das quota de cada usuário 
pode ser vista na figura \ref{fig:quote_control}.

\begin{figure}[ht]
    \includegraphics[scale=0.8]{images/database/quote.eps}
    \caption{Tabelas de controle de quota}
    \label{fig:quote_control}
\end{figure}

\newpage

%\subsubsection{Stored procedures}
\par \textit{Stored procedure} é recurso essencial para o funcionamento do SQM, e como já 
foi dito no capítulo \ref{postgresql_recursos} \ todas elas foram desenvolvidas 
com a linguagem de programação \textit{Python}. Algumas delas são usadas por outras 
\textit{stored procedures} e outras são executadas -- ou disparadas -- por \textit{triggers}. 
A seguir, vamos explicar quando cada uma é executada e qual sua função.

\begin{itemize}

\item \textbf{\textit{update\_quote()}}: Executada toda vez que um registro é inserido na 
tabela \textbf{\textit{network\_traffic}}. Sua função é contabilizar o tráfego gerado por 
cada usuário. O resultado desta contabilização fica armazenado na tabela 
\textbf{quote}. 

\item \textbf{\textit{verify\_quote(user\_id integer, month integer, year integer)}}: 
Executada ao fim de \textbf{\textit{update\_quote()}} ou sempre 
que houver modificação(\textit{INSERT, UPDATE} ou \textit{DELETE}) na tabela \textbf{\textit{quote\_custom}}. 
Sua função é verificar se a quota do usuário passado como parâmetro ainda não 
foi excedida. Caso a quota tenha sido excedida, o campo \textbf{\textit{block}} será 
configurado para verdadeiro, o que causará o bloqueio do acesso a internet para 
este usuário.

\item \textbf{\textit{create\_user()}}: Executada toda vez que um novo registro é inserido 
na tabela \textbf{\textit{network\_traffic}}. Sua função é verificar se o usuário que fez 
a solicitação ao \textit{Squid} já existe na tabela \textbf{\textit{quote}} no momento(mês e ano) 
da solicitação e, caso não esteja ele será inserido.

\item \textbf{\textit{create\_quote\_month(month integer, year integer)}}: Executada por
 \textbf{\textit{create\_user()}}. Sua função é verificar se o mês e o ano 
passados como parâmetro já existem na tabela \textbf{\textit{quote\_month}}, e em caso 
negativo será criado.

\item \textbf{\textit{quote\_free(url\_id integer)}}: Executada por 
\textbf{\textit{update\_quote}}. Verifica se o domínio da url\_id 
passada como parâmetro é livre de quota, ou seja, se o domínio não entra para a 
contabilização de quota.
\end{itemize}

